﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PTTK_HTTT_06.BUS;

namespace PTTK_HTTT_06.GUI.LenThucDon
{
    public partial class MHLapThucDon : UserControl
    {
        //
        public NHAN_VIEN nhanVien { get; set; }
        private bool choPhepThayDoiNgay = true;
        private THUC_DON thucDon = null;
        private List<CT_THUC_DON> ctThucDonList = null;

        public MHLapThucDon()
        {
            InitializeComponent();
        }

        #region MHLapThucDon_Load()
        private void MHLapThucDon_Load(object sender, EventArgs e)
        {
            //cài đặt ngày
            int numNextMonday = DayOfWeek.Monday - (DateTime.Now.AddDays(7)).DayOfWeek;
            DateTime nextMonday = DateTime.Now.AddDays(7 + numNextMonday);
            dtPickerNgayBatDau.MinDate = nextMonday.Date;

            //thay đổi ngày của gViewDsNgay
            ThayDoiNgayCuagViewDsNgay();

            //tải danh sách món ăn lên combobox
            TaiDanhSachMonAn();

            //Tự động insert
            //AutoSelect();
        }
        #endregion


        #region auto select
        private void AutoSelect()
        {
            for (int i = 0; i < gViewDsNgay.Rows.Count; i++)
            {
                gViewDsNgay.Rows[i].Selected = true;

                //thêm món
                for (int j = 0; j < cbbMonAn.Items.Count-20; j++)
                {
                    cbbMonAn.SelectedIndex = j;
                    nbSoLuong.Value = 500;
                    btnChonMon_Click(btnChonMon, null);
                }
            }
        }
        #endregion


        #region sự kiện trả ra thông báo lỗi
        public event EventHandler ThongBaoLoi;
        private void OnThongBaoLoi(string error)
        {
            EventHandler handler = ThongBaoLoi;
            if (handler != null) handler(error, EventArgs.Empty);
        }
        #endregion

        #region xử lý sự kiện value changed cho NgayBatDau
        private void dtPickerNgayBatDau_ValueChanged(object sender, EventArgs e)
        {
            if (choPhepThayDoiNgay)
            {
                choPhepThayDoiNgay = false;
                DateTime curSelectDate = DateTime.Parse((sender as DateTimePicker).Text).Date;
                if (curSelectDate > DateTime.Now && curSelectDate.DayOfWeek != DayOfWeek.Monday)
                {
                    int numMonday = DayOfWeek.Monday - curSelectDate.DayOfWeek;
                    DateTime getMonday = curSelectDate.Date;

                    dtPickerNgayBatDau.Value = getMonday.AddDays(numMonday);
                    dtPickerNgayKetThuc.Value = getMonday.AddDays(numMonday + 6);
                }
                else
                {
                    choPhepThayDoiNgay = true;
                    dtPickerNgayKetThuc.Value = curSelectDate.AddDays(6);
                }
                ThayDoiNgayCuagViewDsNgay();
                choPhepThayDoiNgay = true;
            }
        }
        #endregion

        #region xử lý sự kiện value changed cho NgayKetThuc
        private void dtPickerNgayKetThuc_ValueChanged(object sender, EventArgs e)
        {
            if (choPhepThayDoiNgay)
            {
                choPhepThayDoiNgay = false;
                DateTime curSelectDate = DateTime.Parse((sender as DateTimePicker).Text).Date;
                if (curSelectDate > DateTime.Now && curSelectDate.DayOfWeek != DayOfWeek.Sunday)
                {
                    int numMonday = DayOfWeek.Monday - curSelectDate.DayOfWeek;
                    DateTime getMonday = curSelectDate.Date;

                    
                    dtPickerNgayKetThuc.Value = getMonday.AddDays(numMonday + 6);
                    choPhepThayDoiNgay = true;
                    dtPickerNgayBatDau.Value = getMonday.AddDays(numMonday);
                    
                }
                else
                {
                    choPhepThayDoiNgay = true;
                    dtPickerNgayBatDau.Value = curSelectDate.AddDays(-6);
                }
                choPhepThayDoiNgay = true;
            }
        }
        #endregion

        #region xử lý thay ngày của gViewDsNgay
        private void ThayDoiNgayCuagViewDsNgay()
        {
            gViewDsNgay.Rows.Clear();
            for (int i = 0; i < 7; i++)
            {
                DateTime curDate = dtPickerNgayBatDau.Value.Date.AddDays(i);
                gViewDsNgay.Rows.Add(curDate.DayOfYear, DoiTenNgay(curDate.DayOfWeek.ToString()) );
            }
        }

        private string DoiTenNgay(string str)
        {
            switch (str)
            {
                case "Monday":
                    return "Thứ hai";
                case "Tuesday":
                    return "Thứ ba";
                case "Wednesday":
                    return "Thứ tư";
                case "Thursday":
                    return "Thứ năm";
                case "Friday":
                    return "Thứ sáu";
                case "Saturday":
                    return "Thứ bảy";
                case "Sunday":
                    return "Chủ nhật";
                default:
                    return "";
            }
        }
        #endregion

        #region xử lý hiển thị màn hình danh sách yêu cầu nguyên liệu
        private void HienThiManHinhDanhSachYCNguyenLieu()
        {
            //xóa toàn bộ controls
            sContainer_LapThucDon.Panel2.Controls.Clear();

            //Thêm màn hình danh sách yc nguyên liệu
            MHDanhSachYeuCauNguyenLieu mhDanhSach = new MHDanhSachYeuCauNguyenLieu();
            mhDanhSach.thucDon = thucDon;
            mhDanhSach.ctThucDonList = ctThucDonList;
            mhDanhSach.Dock = DockStyle.Fill;

            sContainer_LapThucDon.Panel2.Controls.Add(mhDanhSach);
        }
        #endregion

        #region tải danh sách món ăn
        private void TaiDanhSachMonAn()
        {
            List<MON_AN> monAnList = MON_AN.LayDanhSach();
            cbbMonAn.Items.Clear();
            cbbMonAn.DataSource = monAnList;
            cbbMonAn.ValueMember = "MaMonAn";
            cbbMonAn.DisplayMember = "TenMonAn";

        }
        #endregion



        #region btnChonMon_Click()
        private void btnChonMon_Click(object sender, EventArgs e)
        {
            //kiếm tra dữ liệu
            if (cbbMonAn.SelectedIndex < 0 || nbSoLuong.Value <= 0)
            {
                OnThongBaoLoi("Chưa chọn món ăn hoặc số lương nhỏ hơn 1");
                return;
            }
            else
            {
                OnThongBaoLoi("...");
            }
                
            
            if (ctThucDonList == null)
                ctThucDonList = new List<CT_THUC_DON>();

            // lấy món ăn được chọn
            MON_AN monAnDuocChon = (cbbMonAn.SelectedItem as MON_AN);
            // lấy ngày trong năm
            int dayOfYear = int.Parse(gViewDsNgay.SelectedRows[0].Cells[0].Value.ToString());

            //láy thông tin ra
            CT_THUC_DON ctThucDon = new CT_THUC_DON();
            ctThucDon.MaMonAn = monAnDuocChon.MaMonAn;
            ctThucDon.SoLuong = (int)nbSoLuong.Value;
            ctThucDon.Ngay = new DateTime(DateTime.Now.Year, 1, 1).AddDays(dayOfYear - 1);

            //kiểm tra đã tồn tại món ăn chưa?
            if (ctThucDonList.Where(a => a.MaMonAn == monAnDuocChon.MaMonAn && a.Ngay.Date == ctThucDon.Ngay.Date).Count() > 0)
            {
                // xử lý xóa thằng trước
                ctThucDonList.RemoveAll(a => a.MaMonAn == monAnDuocChon.MaMonAn && a.Ngay.Date == ctThucDon.Ngay.Date);

                // chỉn trong gridview
                for (int i = 0; i < gViewChonMon.Rows.Count; i++)
                {
                    if (int.Parse(gViewChonMon.Rows[i].Cells[1].Value.ToString()) == ctThucDon.MaMonAn)
                        gViewChonMon.Rows[i].Cells[3].Value = ctThucDon.SoLuong.ToString();
                }
            }
            else{
                //thêm vào gridview các món đã được chọn
                int countRow = gViewChonMon.Rows.Count + 1;
                gViewChonMon.Rows.Add(countRow, monAnDuocChon.MaMonAn, monAnDuocChon.TenMonAn, (int)nbSoLuong.Value, "Hủy");

                //if is the odd, show color a different
                if (countRow % 2 != 0)
                    gViewChonMon.Rows[countRow - 1].DefaultCellStyle.BackColor = Color.Honeydew;
            }
                
            // thêm vào ctThucDon
            ctThucDonList.Add(ctThucDon);
        
            //reset dữ liệu
            nbSoLuong.Value = 0;
        }
        #endregion

        #region gViewDsNgay_CellClick()
        private void gViewDsNgay_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            gViewChonMon.Rows.Clear();

            if (ctThucDonList != null) {
                // lấy ngày trong năm
                int dayOfYear = int.Parse(gViewDsNgay.Rows[e.RowIndex].Cells[0].Value.ToString());
                DateTime day = new DateTime(DateTime.Now.Year, 1, 1).AddDays(dayOfYear - 1);

                // lấy danh sách chi tiết theo ngày
                List<CT_THUC_DON> tempCTThucDon = ctThucDonList.Where(a => a.Ngay.Date == day.Date).ToList();

                // lấy danh sách món ăn
                List<MON_AN> monAnList = (cbbMonAn.DataSource as List<MON_AN>);

                // hiển thị lên gridview
                int countRow = 0;
                foreach (CT_THUC_DON ct in tempCTThucDon)
                {
                    countRow++;
                    gViewChonMon.Rows.Add(countRow, ct.MaMonAn, monAnList.Single(a => a.MaMonAn == ct.MaMonAn).TenMonAn, (int)ct.SoLuong, "Hủy");

                    //if is the odd, show color a different
                    if (countRow % 2 != 0)
                        gViewChonMon.Rows[countRow - 1].DefaultCellStyle.BackColor = Color.Honeydew;
                }
            }
            
        }
        #endregion

        #region gViewChonMon_CellClick()
        private void gViewChonMon_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 4)
            {
                //lấy thông tin ra
                int maMonAn = int.Parse(gViewChonMon.Rows[e.RowIndex].Cells[1].Value.ToString());
                int dayOfYear = int.Parse(gViewDsNgay.SelectedRows[0].Cells[0].Value.ToString());

                //xóa đi
                ctThucDonList.RemoveAll(a => a.MaMonAn == maMonAn && a.Ngay.Date == (new DateTime(DateTime.Now.Year, 1, 1).AddDays(dayOfYear - 1)).Date );
                gViewChonMon.Rows.RemoveAt(e.RowIndex);

                //sắp xếp lại hiển thị
                for (int i = 0; i < gViewChonMon.Rows.Count; i++)
                {
                    gViewChonMon.Rows[i].Cells[0].Value = i + 1;

                    //thay đổi màu
                    if (i % 2 == 0)
                        gViewChonMon.Rows[i].DefaultCellStyle.BackColor = Color.Honeydew;
                    else
                        gViewChonMon.Rows[i].DefaultCellStyle.BackColor = Color.White;
                }
            }
        }
        #endregion

        #region btnLuuThucDon_Click()
        private void btnLuuThucDon_Click(object sender, EventArgs e)
        {
            try
            {
                OnThongBaoLoi("...");

                //báo lỗi nếu chưa chọn thực đơn
                if (ctThucDonList == null || ctThucDonList.Count <= 0)
                {
                    OnThongBaoLoi("Chưa chọn thực đơn cho các ngày trong tuần!.");
                    return;
                }

                //Xử lý lưu thực đơn
                if (thucDon == null)
                    thucDon = new THUC_DON();
                thucDon.MaNhanVien = nhanVien.MaNhanVien;
                thucDon.NgayBatDau = dtPickerNgayBatDau.Value.Date;
                thucDon.NgayKetThuc = dtPickerNgayKetThuc.Value.Date;

                //Xử lý lưu thực đơn
                thucDon.MaThucDon = THUC_DON.ThemThucDon(thucDon);
                if (thucDon.MaThucDon == -1)
                {
                    OnThongBaoLoi("Có lỗi xảy ra trong quá trình thực hiện, vui lòng thử lại!.");
                    return;
                }

                //xử lý lưu chi tiết thực đơn
                int numError = 0;
                ctThucDonList = ctThucDonList.OrderBy(a => a.Ngay).ToList();//sắp xếp lại theo ngày tăng dần
                foreach (CT_THUC_DON ct in ctThucDonList)
                {
                    ct.MaThucDon = thucDon.MaThucDon;
                    ct.MaCTThucDon = CT_THUC_DON.ThemCTThucDon(ct);
                    if (ct.MaCTThucDon == -1)
                        numError++;
                        
                }

                //thông báo lỗi
                if (numError > 0)
                    OnThongBaoLoi("Có lỗi xảy, không thêm được "+ numError +" chi tiết thực đơn!.");


                //Xử lý hiển thị trang kết quả
                HienThiManHinhDanhSachYCNguyenLieu();

                //Xử lý hiển thị nút lưu thực đơn & in thực đơn
                btnLuuThucDon.Visible = false;
                btnInThucDon.Location = btnLuuThucDon.Location;
                btnInThucDon.Visible = true;
            }
            catch (Exception ex)
            {
                OnThongBaoLoi(ex.Message);
            }
        }
        #endregion
        
        #region btnInThucDon_Click()
        private void btnInThucDon_Click(object sender, EventArgs e)
        {
            (sContainer_LapThucDon.Panel2.Controls[0] as MHDanhSachYeuCauNguyenLieu).InDanhSach();
        }
        #endregion

        
    }
}
